/**
 * 用户注册请求DTO
 * 
 * 功能说明：
 * - 封装用户注册时提交的请求数据
 * - 提供完整的用户注册信息验证
 * - 支持用户名、密码、邮箱、手机号等基本信息注册
 * - 包含可选的地址、昵称等扩展信息
 * 
 * 数据验证：
 * - 使用JSR-303验证注解进行数据校验
 * - 用户名：必填，长度4-20字符
 * - 密码：必填，长度6-20字符
 * - 邮箱：必填，格式验证
 * - 手机号：可选，自定义格式验证
 * - 地址：可选，最大长度500字符
 * - 昵称：可选，最大长度20字符
 * 
 * 安全考虑：
 * - 密码字段在传输过程中需要HTTPS加密
 * - 密码在服务端存储时会进行BCrypt加密
 * - 不包含敏感信息如身份证号等
 * 
 * 使用场景：
 * - 用户注册接口的请求参数
 * - 用户信息的初始创建
 * - 移动端和Web端注册功能
 * 
 * 设计原则：
 * - 使用标准的验证注解进行数据校验
 * - 提供清晰的错误消息提示
 * - 支持部分字段可选，提高用户体验
 * - 遵循RESTful API设计规范
 * 
 * @author eCommerce Team
 * @version 1.0
 */
package com.ecommerce.auth.dto;

import com.ecommerce.auth.validation.PhoneNumber;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

/**
 * 用户注册请求DTO
 * 封装用户注册时提交的请求数据，包含数据验证规则
 */
public class RegisterRequest {

    /**
     * 用户名
     * - 用户登录时使用的唯一标识
     * - 必填字段，不能为空
     * - 长度限制：4-20个字符
     * - 在整个系统中必须唯一
     */
    @NotBlank(message = "用户名不能为空")
    @Size(min = 4, max = 20, message = "用户名长度必须在4-20个字符之间")
    private String username;

    /**
     * 密码
     * - 用户登录时使用的密码
     * - 必填字段，不能为空
     * - 长度限制：6-20个字符
     * - 在服务端会使用BCrypt进行加密存储
     */
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, max = 100, message = "密码长度必须在6-100个字符之间")
    private String password;

    /**
     * 邮箱地址
     * - 用户的邮箱地址
     * - 必填字段，不能为空
     * - 格式验证：必须符合邮箱格式规范
     * - 用于找回密码、接收通知等
     * - 在整个系统中必须唯一
     */
    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    /**
     * 手机号码
     * - 用户的手机号码
     * - 可选字段，可以为空
     * - 格式验证：使用自定义的@PhoneNumber注解
     * - 用于接收短信验证码、找回密码等
     * - 在整个系统中必须唯一（如果提供）
     */
    @PhoneNumber(message = "手机号格式不正确")
    private String phoneNumber;

    /**
     * 用户地址
     * - 用户的收货地址信息
     * - 可选字段，可以为空
     * - 最大长度限制：500个字符
     * - 用于订单配送等场景
     */
    @Size(max = 500, message = "地址长度不能超过500个字符")
    private String address;

    /**
     * 用户昵称
     * - 用户的显示名称
     * - 可选字段，可以为空
     * - 最大长度限制：20个字符
     * - 用于用户界面展示，比用户名更友好
     */
    @Size(max = 20, message = "昵称长度不能超过20个字符")
    private String nickName;

    /**
     * 获取用户名
     * @return 用户名
     */
    public String getUsername() {
        return username;
    }

    /**
     * 设置用户名
     * @param username 用户名
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 获取密码
     * @return 密码
     */
    public String getPassword() {
        return password;
    }

    /**
     * 设置密码
     * @param password 密码
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * 获取邮箱地址
     * @return 邮箱地址
     */
    public String getEmail() {
        return email;
    }

    /**
     * 设置邮箱地址
     * @param email 邮箱地址
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * 获取手机号码
     * @return 手机号码
     */
    public String getPhoneNumber() {
        return phoneNumber;
    }

    /**
     * 设置手机号码
     * @param phoneNumber 手机号码
     */
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    /**
     * 获取用户昵称
     * @return 用户昵称
     */
    public String getNickName() {
        return nickName;
    }

    /**
     * 设置用户昵称
     * @param nickName 用户昵称
     */
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    /**
     * 获取用户地址
     * @return 用户地址
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置用户地址
     * @param address 用户地址
     */
    public void setAddress(String address) {
        this.address = address;
    }
}